package A_review.review5_9;

import A_review.review5_8.LongestPalindrome;
import listNodePractice.ListNode;

public class ReverseListNode {

    public ListNode reverse(ListNode head){
        if (head.next==null){
            return head;
        }
        ListNode last = reverse(head.next);
        head.next.next=head;
        head.next=null;
        return  last;
    }


    //  CKG TODO 2023/5/9:  使用双指针　卡尔
    public ListNode  reverse1(ListNode head){
        ListNode pre=null;
        ListNode cur=head;
        while (cur!=null){
            ListNode temp=cur.next;
            cur.next=pre;
            pre=cur;
            cur=temp;

        }
        return  pre;
    }

//  CKG TODO 2023/5/9: 递归方法　　卡尔

    public ListNode  reverse2(ListNode head) {
        return  traverse(null,head);
    }

    public  ListNode  traverse(ListNode pre, ListNode  cur){
        if (cur==null){
            return  pre;
        }
        ListNode temp=cur.next;
        cur.next=pre;
       return   traverse(cur,temp);
    }


//  CKG TODO 2023/5/9:  下面两种感觉不太对
//  CKG TODO 2023/5/9: 翻转前ｎ个
    public ListNode  reverseN(ListNode head,int n){
        ListNode pre=null;
        ListNode cur=head;
        int count=0;
        while (cur!=null&&count<=n){
            count++;
            ListNode temp=cur.next;
            cur.next=pre;
            pre=cur;
            cur=temp;
        }
        //  CKG TODO 2023/5/9: 需要再添加一句
        head.next=cur;
        return  pre;
    }

    public ListNode  reverseMN(ListNode head,int m,int n){
        ListNode pre=null;
        ListNode cur=head;
        int count=0;


        while (cur!=null&&count<=n&&count>=m){
            count++;
            ListNode temp=cur.next;
            cur.next=pre;
            pre=cur;
            cur=temp;

        }
        return  pre;
    }




}
